package model;

/**
 * Especifica os tipos de erros que podem ser tratados pelos analisadores.
 * 
 * @author Jody Matos, Alenilson
 * @version 1.1
 * @since 11/08/2011
 * 
 *        <dt><b>History:</b></dt> <dd>1.0: Creation of first methods</dd> <dd>
 *        1.1: Added some semantic errors.
 */
public enum ErrorType {
    NO_ERRORS, NUMBER_FORMING, OPERATOR_FORMING, STRING_FORMING, COMMENT_FORMING, CHAR_FORMING, IDENTIFIER_FORMING, UNEXPECTED_SYMBOL,

    MATCH, GLOBAL_CONST, GLOBAL_VAR, DEC_CLASS, DEC_CONST, DEC_VAR, DEC_MET, FUNCTIONS, ATRB, MET_CALL, EXP_REL, EXP_LOG, EXP_ARIT,

    TYPE_MISMATCH, // TIPO INVALIDO
    IDENTIFIER_REDECLARED, // REDECLARADO
    IDENTIFIER_MISMATCH; // NAO ENCONTRADO OU FORA DO ESCOPO

    /**
     * Sobrescreve a chamada ao método <code>toString()</code>, retornando, para
     * cada tipo de erro, uma <code>String</code> com uma mensagem de erro
     * apropriada para exibição ao usuário.
     */
    @SuppressWarnings("static-access")
    public String toString() {
	if (this == this.NO_ERRORS)
	    return "Contruído com sucesso!";
	else if (this == this.NUMBER_FORMING)
	    return "Erro de formação de Número!";
	else if (this == this.OPERATOR_FORMING)
	    return "Erro de formação de Operador!";
	else if (this == this.STRING_FORMING)
	    return "Erro de formação de Cadeia Constante!";
	else if (this == this.COMMENT_FORMING)
	    return "Erro de formação de Comentário de Bloco!";
	else if (this == this.CHAR_FORMING)
	    return "Erro de formação de Caractere Constante!";
	else if (this == this.IDENTIFIER_FORMING)
	    return "Erro de formação de Identificador (Caractere estranho)!";
	else if (this == this.UNEXPECTED_SYMBOL)
	    return "Caractere inesperado!";
	else if (this == this.GLOBAL_CONST)
	    return "Erro de formação de Constante Global";
	else if (this == this.GLOBAL_VAR)
	    return "Erro de formação de Variável Global";
	else if (this == this.DEC_CLASS)
	    return "Erro de formação na declaração de uma classe";
	else if (this == this.MATCH)
	    return "Erro de verificação de formação";
	else if (this == this.DEC_CONST)
	    return "Erro de formação na declaração de constantes";
	else if (this == this.DEC_VAR)
	    return "Erro de formação na declaração de variáveis";
	else if (this == this.DEC_MET)
	    return "Erro de formação de métodos";
	else if (this == this.FUNCTIONS)
	    return "Erro de formação de funções ou corpo de método";
	else if (this == this.ATRB)
	    return "Erro de formação de atribuição";
	else if (this == this.MET_CALL)
	    return "Erro de formação de chamada de método";
	else if (this == this.EXP_REL)
	    return "Erro de formação de expressões relacionais";
	else if (this == this.EXP_LOG)
	    return "Erro de formação de expressões lógicas";
	else if (this == this.EXP_ARIT)
	    return "Erro de formação de expressões aritiméticas";
	else if (this == this.TYPE_MISMATCH)
	    return "Erro de tipo";
	else if (this == this.IDENTIFIER_REDECLARED)
	    return "Erro de redeclaração de identificador";
	else if (this == this.IDENTIFIER_MISMATCH)
	    return "Erro de identificador fora do escopo ou não declarado.";
	return null;
    }
}
